package com.rchat.pocmini.session;

import android.content.Context;
import android.util.Log;

import com.airtalkee.sdk.AirtalkeeSessionManager;
import com.airtalkee.sdk.OnMediaListener;
import com.airtalkee.sdk.OnSessionIncomingListener;
import com.airtalkee.sdk.OnSessionListener;
import com.airtalkee.sdk.entity.AirContact;
import com.airtalkee.sdk.entity.AirSession;
import com.rchat.pocmini.util.Sound;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by ljd on 2017/2/7.
 * <p>
 * OnSessionListener 接口实现类，返回与会话相关的事件。
 * <p>
 * OnSessionIncomingListener 接口实现类，返回与临时会话来电的事件
 * <p>
 * OnMediaListener 接口实现类，返回与会话中话语权相关的事件
 */

public class PocAirtalkeeSessionListener implements OnSessionListener, OnSessionIncomingListener, OnMediaListener {

    private Context context;
    private AirSession airSession;
    //======== 话语权被释放的原因值 ========
    //用户主动释放话语权
    public static final int TALK_FINISH_REASON_RELEASEND = AirtalkeeSessionManager.TALK_FINISH_REASON_RELEASED;
    //话语权被更高级的用户抢断而终止
    public static final int TALK_FINISH_REASON_GRABEN = AirtalkeeSessionManager.TALK_FINISH_REASON_GRABED;
    //申请话语权超市，未申请上话语权而结束
    public static final int TALK_FINISH_REASON_TIMEOUT = AirtalkeeSessionManager.TALK_FINISH_REASON_TIMEOUT;
    //用户发言时长已到，服务器自动终止用户的发言
    public static final int TALK_FINISH_REASON_TIMEUP = AirtalkeeSessionManager.TALK_FINISH_REASON_TIMEUP;
    //由于用户网络原因，连续间隔一定时间服务器依然未能收到用户的通话数据包而产生的异常，从而自动收回用户的话语权
    public static final int TALK_FINISH_REASON_EXCEPTION = AirtalkeeSessionManager.TALK_FINISH_REASON_EXCEPTION;
    //用户仅有只听权限，不允许发言
    public static final int TALK_FINISH_REASON_LISTEN_ONLY = AirtalkeeSessionManager.TALK_FINISH_REASON_LISTEN_ONLY;
    //允许讲话人数或排队人数已达到上限，当频道内不允许排队时，别人在讲话，本人申请话语权会收到此事件：
    //当频道内允许排队时，一旦达到排队最大人数再申请话语权，也会收到此事件
    public static final int TALK_FINISH_REASON_SPEAKING_FULL = AirtalkeeSessionManager.TALK_FINISH_REASON_SPEAKING_FULL;


    public PocAirtalkeeSessionListener(Context context, AirSession airSession) {
        this.context = context;
        this.airSession = airSession;
    }

    //================ OnSessionListener方法 ===============//

    /**
     * 临时会话主叫呼出振铃事件（临时会话主叫呼叫对方，当对方来电振铃时，此时主叫方同事会触发主叫振铃，
     * 表明呼叫正在等待接听。）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onSessionOutgoingRinging(AirSession airSession) {
        Sound.playSound(Sound.PLAYER_CALL_DIAL, true, context,null);
    }

    /**
     * 临时或频道会话呼出开始建立事件（用户调用SessionCall后返回此事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onSessionEstablishing(AirSession airSession) {
//        Sound.playSound(Sound.PLAYER_CALL_DIAL, true, context);
    }


    /**
     * 临时或频道会话建立事件（来电或去电呼叫、或频道会话建立成功后返回此事件）
     *
     * @param airSession 会话实例
     * @param i          ？？？这个参数文档没有
     */
    @Override
    public void onSessionEstablished(AirSession airSession, int i) {
        Sound.stopSound(Sound.PLAYER_CALL_DIAL);
    }

    /**
     * 临时或频道会话结束事件
     *
     * @param airSession 会话实例
     * @param reason     会话结束原因值，具体值参考SESSION_RELEASE_REASON_XXX
     */
    @Override
    public void onSessionReleased(AirSession airSession, int reason) {
        Sound.stopSound(Sound.PLAYER_CALL_DIAL);
    }

    /**
     * 临时或频道会话用户参与会话事件（会话过程中，动态变化的用户参与此会话情况，均通过此事件通知）
     *
     * @param airSession         会话实例
     * @param memberList         会话预期的所有成员（如频道的所有成员，或临时会话选定的用户）
     * @param memberPresenceList 会话中实际参与或通过此次对话的成员
     */
    @Override
    public void onSessionPresence(AirSession airSession, List<AirContact> memberList, List<AirContact> memberPresenceList) {
    }


    @Override
    public void onSessionMemberUpdate(AirSession airSession, List<AirContact> list, boolean b) {
    }

    //================ OnSessionIncomingListener方法 ===============//

    /**
     * 临时会话来电提醒开始事件（当有其他用户呼叫此用户时触发）
     *
     * @param airSession 会话实例
     * @param airContact 主叫人信息
     * @param isAccepted 是否已自动接听（当用户设置为自动应答时有效）
     */

    @Override
    public void onSessionIncomingAlertStart(AirSession airSession, AirContact airContact, boolean isAccepted, boolean b1, boolean b2) {
        this.airSession = airSession;
        Sound.playSound(Sound.PLAYER_CALL_DIAL, true, context,null);
    }

    /**
     * 临时会话来电提醒结束事件（临时会话来电提醒已结束，比如对方已挂断或取消等，在此来电还未接通时被动结束时，会触发此事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onSessionIncomingAlertStop(AirSession airSession) {
    }


    //================ OnMediaListener方法 ===============//

    /**
     * 本来开始讲话事件（本人申请话语权时会第一个回调此事件，可用于UI对界面进行状态刷新）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onMediaStateTalkPreparing(AirSession airSession) {
    }

    /**
     * 本人开始讲话事件（本人申请到话语权开始讲话的事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onMediaStateTalk(AirSession airSession) {
    }

    /**
     * 本人结束讲话事件（本人话语权被释放事件，同时返回话语权被释放的原因）
     *
     * @param airSession 会话实例
     * @param reason     话语权被释放的原因
     */
    @Override
    public void onMediaStateTalkEnd(AirSession airSession, int reason) {
    }

    /**
     * 别人开始讲话事件（别人开始讲话事件）
     *
     * @param airSession        会话实例
     * @param airContactSpeaker 讲话人信息
     */
    @Override
    public void onMediaStateListen(AirSession airSession, AirContact airContactSpeaker) {
    }

    /**
     * 别人结束讲话事件（别人结束讲话的事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onMediaStateListenEnd(AirSession airSession) {
    }

    /**
     * ？？文档没有说明此方法
     *
     * @param airSession airSession
     */
    @Override
    public void onMediaStateListenVoice(AirSession airSession) {

    }

    /**
     * 排队列表事件（最新排队人列表，排队列表变更时会收到服务器推送过来的此事件）
     *
     * @param airSession 会话实例
     * @param queue      排队人列表
     */
    @Override
    public void onMediaQueue(AirSession airSession, ArrayList<AirContact> queue) {
    }

    /**
     * 排队入队确认事件（当用户在允许排队的频道内申请话语权，同时当前有人正占用话语权时，服务器允许用户进入排队状态，会返回此事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onMediaQueueIn(AirSession airSession) {
    }

    /**
     * 排队出队确认事件（当用户已在排队队列中，用户取消话语权会返回此事件）
     *
     * @param airSession 会话实例
     */
    @Override
    public void onMediaQueueOut(AirSession airSession) {
    }
}
